//////////////////////////////////////////////////////////////////////
//
// NO_Stack.h: interface for the NO_Stack class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
#ifndef NO_STACK_H
#define NO_STACK_H

//////////////////////////////////////////////////////////////////////////
template<class Node>
class NO_Stack
{
public:
	//////////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	NO_Stack():head(NULL), num(0){}
	NO_Stack& operator= (const NO_Stack& rhs){return (*this);}

	//////////////////////////////////////////////////////////////////////////
	// retrive
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	bool	isEmpty (void) {return (num == 0);}
	int		getSize (void) {return num;}
	Node**	getHead (void) {return &head;}
	Node*	getTop	(void) {return head;}

	//////////////////////////////////////////////////////////////////////////
	// modify
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	void  push (Node* n){if(!n)return; n->next = head; head = n; num++;}
	Node* pop  (void)	{Node *n = head; if (n) head = head->next; num--; return n;} 

private:
	//////////////////////////////////////////////////////////////////////////
	Node* head;
	int num;
};

#endif 
